package com.cqh.recruit.service.impl;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cqh.recruit.mapper.StudentMapper;
import com.cqh.recruit.pojo.dto.StudentLoginDTO;
import com.cqh.recruit.pojo.dto.StudentQueryDto;
import com.cqh.recruit.pojo.dto.UpdatePasswordDTO;
import com.cqh.recruit.pojo.entity.LoginInfo;
import com.cqh.recruit.pojo.entity.Student;
import com.cqh.recruit.pojo.vo.StudentListVo;
import com.cqh.recruit.service.IStudentService;
import com.cqh.recruit.utils.JwtUtils;
import com.cqh.recruit.utils.StudentThreadLocal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 学生信息表 服务实现类
 * </p>
 *
 * @author dh
 * @since 2025-10-18
 */
@Service

public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {

    @Autowired
    private StudentMapper studentMapper;

    /**
     * 登录,根据账号和密码查询用户
     * @param student
     * @return
     */
    @Override
    public LoginInfo login(StudentLoginDTO student) {
        //调用Mapper接口，根据账号和密码查询用户
        Student stu=studentMapper.login(student);

        //2.判断账号和密码是否存在
        if (stu != null) {
            //生成JWT 令牌
            Map<String, Object> claims = new HashMap<>();//存放学生信息
            claims.put("stuId", stu.getId());//学生id
            claims.put("account", stu.getAccount());//学生账号
            claims.put("name", stu.getName());//学生姓名
            String jwt = JwtUtils.generateToken(claims);//生成JWT令牌

            return new LoginInfo(stu.getId(),stu.getAccount(), stu.getName(), stu.getAvatar(),jwt);
        }
        return null;
    }

    /**
     * 退出登录
     */
    @Override
    public void logout() {
        // 退出登录的主要操作是在拦截器的afterCompletion方法中完成的
        // 这里可以考虑将JWT令牌加入黑名单以实现真正的会话管理
        // 但现在只是移除ThreadLocal中的数据
        StudentThreadLocal.remove();
    }



    /**
     * 修改密码
     * @param updatePasswordDto
     * @param stuId
     */
    @Override
    public void updatePassword(UpdatePasswordDTO updatePasswordDto, Long stuId) {
        // 1. 参数健壮性校验
        if (updatePasswordDto == null || !StringUtils.hasText(updatePasswordDto.getPassword()) || !StringUtils.hasText(updatePasswordDto.getNewPassword())) {
            throw new RuntimeException("原密码和新密码不能为空");
        }

        if (updatePasswordDto.getPassword().equals(updatePasswordDto.getNewPassword())) {
            throw new RuntimeException("新密码不能与原密码相同");
        }

        // 3. 查询用户是否存在
        Student stu = getById(stuId);
        if (stu == null) {
            throw new RuntimeException("当前登录用户信息异常，用户不存在!");
        }

        // 4. 校验原密码
        if (!stu.getPassword().equals(updatePasswordDto.getPassword())) {
            throw new RuntimeException("原密码输入错误！！！");
        }

        // 5. 修改密码 (不加密，直接存储)
        stu.setPassword(updatePasswordDto.getNewPassword());
        boolean success = updateById(stu);

        if (!success) {
            throw new RuntimeException("修改密码失败！");
        }
    }

    @Override
    public Page<StudentListVo> findStudentByQueryDto(StudentQueryDto studentQueryDto) {
        Page page=new Page(studentQueryDto.getPage(),studentQueryDto.getLimit());
        return getBaseMapper().findStudentByQueryDto(page,studentQueryDto);
    }

    /**
     * 查询当前登录用户的信息
     * @return
     */
    @Override
    public Student findStudentInfoById() {
        return getById(StudentThreadLocal.get().getId());
    }
}